package cn.itcast.processVariables;

import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class processVariablesTest {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	//部署流程定义（从inputStream）
	@Test
	public void deploymentProcessDefinition_inputStream(){
	InputStream bpmn=this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
	InputStream png=this.getClass().getResourceAsStream("/diagrams/processVariables.png");
	Deployment deployment	=processEngine.getRepositoryService()//与流程定义和部署对象关联的
		            .createDeployment()//创建部署对象
		            .name("流程定义")
		            .addInputStream("processVariables.bpmn", bpmn)
		            .addInputStream("processVariables.png", png)
		            .deploy();//完成部署
	System.out.println(deployment.getId());
	System.out.println(deployment.getName());
	}
	//启动流程定义
	@Test
	public void startProcessInstance(){
	ProcessInstance p1=	processEngine.getRuntimeService()//与正在执行的流程实例和和执行对象相关的service
	                 .startProcessInstanceByKey("processVariables");//使用流程对应的key启动流程实例，与hello.bpmn中id对应,默认对应最新版本流程使用
	System.out.println(p1.getId());//流程实例id
	System.out.println(p1.getProcessDefinitionId());//流程定义id
	
	}
	/**
	 * `act_ru_variable`正在执行的流程变量
	 */
	//设置流程变量
	@Test
	public void setVarianles(){
		TaskService taskService= processEngine.getTaskService();
		String taskId="3804";
		/**
		 * 设置流程变量，使用基本数据类型
		 */
//        taskService.setVariableLocal(taskId, "请假天数", 2);//与任务id绑定
//        taskService.setVariable(taskId, "请假日期", new Date());
//        taskService.setVariable(taskId, "请假原因", "年假");
		/**
		 * 设置流程变量，使用javabean类型
		 * 当一个javabean（实现序列号）放置到流程变量中，要就javabean的属性不能发生变化，如果发生变化
		 * 就会抛出异常
		 * 解决办法：javabean中生成	private static final long serialVersionUID = 6454577846083289475L;
		 *                         并实现Serializable接口
		 */
		Person p=new Person();
		p.setId(10);
		p.setName("翠花");
		taskService.setVariableLocal(taskId, "人员信息", p);
		System.out.println("设置变量成功");
	}
	//获取流程变量
	@Test
	public void getVarianles(){
		TaskService taskService= processEngine.getTaskService();
		String testId="1904";
		Integer days=(Integer)taskService.getVariable(testId, "请假天数");
		System.out.println(days);
	}
	//模拟设置流程变量和获取流程变量的场景
	public void setAndgetVariables(){
		//与流程实例，执行对象（正在执行）
		RuntimeService runtimeService=processEngine.getRuntimeService();
		//与任务（正在执行）
		TaskService taskService= processEngine.getTaskService();
//		runtimeService.setVariable(executionId, variableName, value);//执行对象id，流程变量名称，设置流程变量的值（设置一个值）
//	    runtimeService.setVariables(executionId, variables);//执行对象id,map集合，map中key是流程变量的名称，value是流程变量的值（设置多个值）

//		taskService.setVariable(taskId, variableName, value);//执行任务id，流程变量名称，设置流程变量的值（设置一个值）
//	    taskService.setVariables(taskId, variables);//执行任务id,map集合，map中key是流程变量的名称，value是流程变量的值（设置多个值）

//	    runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)//启动流程实例，设置流程变量
//	    taskService.complete(taskId, variables);  //完成任务同时设置流程变量
		
//		runtimeService.getVariable(executionId, variableName);//执行对象id和流程对象名称获取流程对象
//		runtimeService.getVariables(executionId, variableNames)//使用执行对象id获取流程定义的值，通过设置流程变量的名称放到集合中，获取指定流程变量名称的流程变量的值放到map集合中
		
//		taskService.getVariable(executionId, variableName);//任务id和流程对象名称,获取流程对象
//		taskService.getVariables(executionId, variableNames)//使用任务id获取流程定义的值，通过设置流程变量的名称放到集合中，获取指定流程变量名称的流程变量的值放到map集合中

	}
	//完成我的任务
			@Test
			public void completeMyPersonalTesk(){
				processEngine.getTaskService()
				              .complete("3202");
				System.out.println("1");
				
			}	
			//查询当前人的个人任务
			@Test
			public void findMyPersonalTesk(){
					
			List<Task> list=processEngine.getTaskService()//与正在执行的任务相关的service
					                    .createTaskQuery()//创建人物查询对象
					                    .taskAssignee("李大大")
					                    .list();
			if(list!=null&&list.size()>=0){
				for(Task task:list){
				System.out.println("任务ID"+task.getId());
				System.out.println("任务名字"+task.getName());
				System.out.println("任务办理人"+task.getAssignee());
				System.out.println("流程实例id"+task.getProcessInstanceId());
				System.out.println("流程定义id"+task.getProcessDefinitionId());
				}	
			}}
}
